﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using ProveedorVuelosWCF.Dominio;

namespace ProveedorVuelosWCF
{
    // NOTA: puede usar el comando "Rename" del menú "Refactorizar" para cambiar el nombre de clase "VuelosService" en el código, en svc y en el archivo de configuración a la vez.
    // NOTA: para iniciar el Cliente de prueba WCF para probar este servicio, seleccione VuelosService.svc o VuelosService.svc.cs en el Explorador de soluciones e inicie la depuración.
    public class ProveedorVuelosService : IProveedorVuelosService
    {
        public List<Vuelo> Obtener_Vuelos(string pStrOrigen, string pStrDestino, DateTime pDatFechaSalida, DateTime? pDatFechaRetorno, int pIntCantAultos, int pIntCantNinos, int pIntCantInfantes, string pStrTipoVuelo)
        {
            Persistencia.CiudadDAO objCiudadDAO = new Persistencia.CiudadDAO();

            if (!objCiudadDAO.ExisteCiudad(pStrOrigen)) {
                throw new FaultException<ValidationException>(new ValidationException { ValidationError = "Ciudad de origen no existe" }, new FaultReason("Ciudad no encontrada"));
            }
            else if (!objCiudadDAO.ExisteCiudad(pStrDestino)) {
                throw new FaultException<ValidationException>(new ValidationException { ValidationError = "Ciudad de destino no existe" }, new FaultReason("Ciudad no encontrada"));            
            }
            else
            {
                List<Vuelo> lstVuelos = new List<Vuelo>();
                int intNroVuelo = 342;
                List<LineaAerea> lstLineasAereas = Obtener_LineasAereas();

                int intPosicionLA;
                int intCantHorarios;

                if (pStrOrigen == "XXX" || pStrDestino == "XXX")
                {
                    return lstVuelos;
                }
                else
                {
                    for (int intVuelo = 0; intVuelo <= 6; intVuelo++)
                    {
                        Random objRandomLA = new Random();
                        intCantHorarios = objRandomLA.Next(1, 7);
                        System.Threading.Thread.Sleep(100);
                        intPosicionLA = objRandomLA.Next(0, lstLineasAereas.Count);

                        Vuelo objVuelo = new Vuelo();
                        objVuelo.CodigoOrigen = pStrOrigen;
                        objVuelo.NombreOrigen = pStrOrigen; //"origen1";
                        objVuelo.CodigoDestino = pStrDestino;
                        objVuelo.NombreDestino = pStrDestino; //"destino1";
                        objVuelo.FechaSalida = pDatFechaSalida;
                        objVuelo.FechaRetorno = pDatFechaRetorno;
                        objVuelo.NroVuelo = intNroVuelo + intVuelo;
                        objVuelo.CodigoLineaAerea = lstLineasAereas[intPosicionLA].Codigo;
                        objVuelo.NombreLineaAerea = lstLineasAereas[intPosicionLA].Nombre;
                        objVuelo.TarifaAdulto = objRandomLA.Next(120, 500);
                        objVuelo.TarifaNino = objRandomLA.Next(120, (int)(objVuelo.TarifaAdulto));
                        objVuelo.TarifaInfante = objRandomLA.Next(120, (int)(objVuelo.TarifaNino));
                        objVuelo.Impuestos = objRandomLA.Next(80, (int)(objVuelo.TarifaAdulto));
                        objVuelo.TipoVuelo = pStrTipoVuelo;

                        List<HorarioVuelo> lstHorarioVuelo = new List<HorarioVuelo>();
                        for (int intHorarioVuelo = 0; intHorarioVuelo <= intCantHorarios; intHorarioVuelo++)
                        {
                            HorarioVuelo objHorarioVuelo = new HorarioVuelo();
                            objHorarioVuelo.CodigoOrigen = pStrOrigen;
                            objHorarioVuelo.NombreOrigen = pStrOrigen; //"origen2";
                            objHorarioVuelo.CodigoDestino = pStrDestino;
                            objHorarioVuelo.NombreDestino = pStrDestino; // "origen2";
                            objHorarioVuelo.CodigoHorario = lstHorarioVuelo.Count + 1;
                            objHorarioVuelo.FechaSalida = DateTime.Parse(pDatFechaSalida.ToString("dd/MM/yyyy") + " " + Obtener_RandomHora());
                            objHorarioVuelo.FechaLlegada = objHorarioVuelo.FechaSalida.AddMinutes(124);
                            objHorarioVuelo.EsRetorno = false;
                            objHorarioVuelo.CodigoLineaAerea = objVuelo.CodigoLineaAerea;
                            lstHorarioVuelo.Add(objHorarioVuelo);

                            System.Threading.Thread.Sleep(100);
                            if (pStrTipoVuelo == "RT")
                            {
                                HorarioVuelo objHorarioVueloRet = new HorarioVuelo();
                                objHorarioVueloRet.CodigoOrigen = pStrOrigen;
                                objHorarioVueloRet.NombreOrigen = pStrOrigen;  //"origen3";
                                objHorarioVueloRet.CodigoDestino = pStrDestino;
                                objHorarioVueloRet.NombreDestino = pStrDestino; //"origen3";
                                objHorarioVueloRet.CodigoHorario = lstHorarioVuelo.Count + 1;
                                objHorarioVueloRet.FechaSalida = DateTime.Parse(pDatFechaRetorno.Value.ToString("dd/MM/yyyy") + " " + Obtener_RandomHora()); ;
                                objHorarioVueloRet.FechaLlegada = objHorarioVueloRet.FechaSalida.AddMinutes(130);
                                objHorarioVueloRet.EsRetorno = true;
                                objHorarioVueloRet.CodigoLineaAerea = objVuelo.CodigoLineaAerea;
                                lstHorarioVuelo.Add(objHorarioVueloRet);
                            }
                        }
                        objVuelo.HorariosVuelo = lstHorarioVuelo;
                        lstVuelos.Add(objVuelo);
                    }
                    return lstVuelos;
                }
            }
        }

        public String GenerarReserva() {
            var strCaracteres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            var objRandom = new Random();
            var strCodigoReserva = new string(Enumerable.Repeat(strCaracteres, 6).Select(s => s[objRandom.Next(s.Length)]).ToArray());
            return strCodigoReserva;
        }

        private String Obtener_RandomHora()
        {
            Random objRandomLA = new Random();
            int intHora = objRandomLA.Next(0, 23);
            int intMinutos = objRandomLA.Next(1, 59);

            return intHora + ":" + intMinutos;
        }

        private List<LineaAerea> Obtener_LineasAereas()
        {
            List<LineaAerea> lstLineasAereas = new List<LineaAerea>();
            LineaAerea objLineaAerea1 = new LineaAerea();
            objLineaAerea1.Codigo = "LP";
            objLineaAerea1.Nombre = "Lan Perú";
            lstLineasAereas.Add(objLineaAerea1);

            LineaAerea objLineaAerea2 = new LineaAerea();
            objLineaAerea2.Codigo = "AA";
            objLineaAerea2.Nombre = "American Airlines";
            lstLineasAereas.Add(objLineaAerea2);

            LineaAerea objLineaAerea3 = new LineaAerea();
            objLineaAerea3.Codigo = "P9";
            objLineaAerea3.Nombre = "Peruvian Airlines";
            lstLineasAereas.Add(objLineaAerea3);

            LineaAerea objLineaAerea4 = new LineaAerea();
            objLineaAerea4.Codigo = "CM";
            objLineaAerea4.Nombre = "Copa Airlines";
            lstLineasAereas.Add(objLineaAerea4);

            LineaAerea objLineaAerea5 = new LineaAerea();
            objLineaAerea5.Codigo = "AV";
            objLineaAerea5.Nombre = "Avianca";
            lstLineasAereas.Add(objLineaAerea5);

            return lstLineasAereas;
        }
    }
}
